Python的xlwings包是一个功能非常强大的包。它本质上是二次封装了VBA所使用的Excel类库。所以,从这方面讲,VBA能做的,基于xlwings包Python也能做。本节主要介绍如何使用xlwings包设置单元格区域的边框、单元格区域的背景色、设置字体、对齐方式和单元格区域的合并和quxiao 合并等。[大谦Excel,dqexcel点com]
设置边框
【问题描述】
用xlwings包设置单元格区域的边框。
【示例11-1】
本例使用的Excel文件的完整路径为“D:/Samples/ch11/xlwings/01 设置边框/班级检查.xlsx”。该文件打开后如图11-1所示,是各班班级检查的得分表。请给数据所在单元格区域添加边框。内边框设置为黑色细线,外边框设置为红色粗线。
图11-1 班级检查得分表
- 编写下面的xlwings代码:
import xlwings as xw
# 打开文件
filename = 'D:/Samples/ch11/xlwings/01 设置边框/班级检查.xlsx'
wb = xw.Book(filename)
# 选择单元格区域
sheet = wb.sheets[0]
rng = sheet.range('B3:I16')
# 设置外边框为粗红线
border = xw.constants.LineStyle.xlContinuous # 实线样式
weight = xw.constants.BorderWeight.xlThick # 粗线条宽度
color = xw.utils.rgb_to_int((255, 0, 0)) # 红色
rng.api.Borders(xw.constants.BordersIndex.xlEdgeLeft).LineStyle = border
rng.api.Borders(xw.constants.BordersIndex.xlEdgeTop).LineStyle = border
rng.api.Borders(xw.constants.BordersIndex.xlEdgeRight).LineStyle = border
rng.api.Borders(xw.constants.BordersIndex.xlEdgeBottom).LineStyle = border
rng.api.Borders(xw.constants.BordersIndex.xlInsideVertical).LineStyle = border
rng.api.Borders(xw.constants.BordersIndex.xlInsideHorizontal).LineStyle = border
rng.api.Borders(xw.constants.BordersIndex.xlEdgeLeft).Weight = weight
rng.api.Borders(xw.constants.BordersIndex.xlEdgeTop).Weight = weight
rng.api.Borders(xw.constants.BordersIndex.xlEdgeRight).Weight = weight
rng.api.Borders(xw.constants.BordersIndex.xlEdgeBottom).Weight = weight
rng.api.Borders(xw.constants.BordersIndex.xlInsideVertical).Weight = xw.constants.BorderWeight.xlThin
rng.api.Borders(xw.constants.BordersIndex.xlInsideHorizontal).Weight = xw.constants.BorderWeight.xlThin
rng.api.Borders(xw.constants.BordersIndex.xlEdgeLeft).Color = color
rng.api.Borders(xw.constants.BordersIndex.xlEdgeTop).Color = color
rng.api.Borders(xw.constants.BordersIndex.xlEdgeRight).Color = color
rng.api.Borders(xw.constants.BordersIndex.xlEdgeBottom).Color = color
# 设置内边框为细黑线
color = xw.utils.rgb_to_int((0, 0, 0)) # 黑色
rng.api.Borders(xw.constants.BordersIndex.xlInsideVertical).Color = color
rng.api.Borders(xw.constants.BordersIndex.xlInsideHorizontal).Color = color
# 保存文件并关闭应用
wb.save()
wb.close()
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,打开示例数据文件,在工作表中设置数据所在单元格区域的内边框和外边框如图11-2所示。然后关闭工作簿。
图11-2 设置数据所在单元格区域的边框
【知识点扩展】
使用xlwings包之前需要先导入该包,即
import xlwings as xw
使用xlwings的Book函数可以直接打开示例数据文件。该函数返回一个Excel工作簿对象。
filename = 'D:/Samples/ch11/xlwings/01 设置边框/班级检查.xlsx'
wb = xw.Book(filename)
对工作簿对象的sheets属性值进行索引,得到第1个工作表。
sheet = wb.sheets[0]
用工作表对象的range属性,指定单元格区域范围,得到数据所在的单元格区域。
rng = sheet.range('B3:I16')
然后就可以对该单元格区域进行边框设置了。
操作完成以后,用工作簿对象的save方法保存数据。
wb.save()
用工作簿对象的close方法关闭工作簿。
wb.close()
此时Excel窗口仍然还在,把上面的语句用下面的语句代替,可以实现退出Excel应用窗口。注意,必须时替换,不能在上面语句后面添加,否则出错。
wb.app.kill()
与xlwings包有关的内容比较多,感兴趣的同学可以参阅本人拙作《代替VBA!用Python轻松实现Excel编程》一书。
设置背景色
【问题描述】
用xlwings包打开Excel文件,并设置工作表中指定单元格区域的背景色。
【示例11-2】
本例使用的Excel文件的完整路径为“D:/Samples/ch11/xlwings/ 02 设置背景色/学生成绩.xlsx”。该文件打开后如图11-3所示,是各考生的语文、数学和英语考试成绩。要求在B-D列中,将值大于等于95的单元格的背景色设置为粉红色,将值小于60的单元格的背景色设置为淡绿色。
图11-3 各科目考试成绩
- 编写下面的xlwings代码:
import xlwings as xw
# 打开Excel文件
file_path = 'D:/Samples/ch11/xlwings/02 设置背景色/学生成绩.xlsx'
app = xw.App(visible=False)
workbook = app.books.open(file_path)
# 获取第一个工作表
worksheet = workbook.sheets[0]
# 遍历B-D列,将值大于等于95的单元格设置为粉红色,将值小于60的单元格设置为淡绿色
for column in ['B', 'C', 'D']:
for cell in worksheet.range(f'{column}2:{column}11'):
if cell.value is not None:
if cell.value >= 95:
cell.color = xw.utils.rgb_to_int((255, 192, 203)) # 粉红色
elif cell.value < 60:
cell.color = xw.utils.rgb_to_int((144, 238, 144)) # 淡绿色
# 保存并退出Excel应用
workbook.save()
app.quit()
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,打开示例数据文件,在工作表中设置指定单元格的背景色如图11-4所示。然后保存工作簿,退出Excel应用。
图11-4 设置单元格的背景色
【知识点扩展】
设置单元格的背景色,设置cell对象的color属性即可。xlwings中设置颜色的方法是使用xw.utils.rgb_to_int函数,用颜色的红色、绿色和兰色分量进行设置。
cell.color = xw.utils.rgb_to_int((255, 192, 203))
设置字体
【问题描述】
用xlwings包打开Excel文件,并设置工作表中指定单元格中文本的字体。
【示例11-3】
本例使用的Excel文件的完整路径为“D:/Samples/ch11/xlwings/03 设置字体/成绩.xlsx”。该文件打开后如图11-5所示,是示例11-2数据的一部分。要求设置B3单元格中文本的字体,字体名称为“黑体”,字体大小为20,加粗,字体颜色为红色;D4单元格中文本的字体名称为“宋体”,字体大小为30,字体颜色为兰色,倾斜。
图11-5 成绩数据
- 编写下面的xlwings代码:
import xlwings as xw
# 打开成绩.xlsx文件
wb = xw.Book(r'D:/Samples/ch11/xlwings/03 设置字体/成绩.xlsx')
# 获取Sheet1工作表
sht = wb.sheets['Sheet1']
# 设置B3单元格中文本的字体
sht.range('B3').api.Font.Name = '黑体'
sht.range('B3').api.Font.Size = 20
sht.range('B3').api.Font.Bold = True
sht.range('B3').api.Font.Color = xw.utils.rgb_to_int((255, 0, 0)) # 将颜色参数转换为RGB整数值
# 设置D4单元格中文本的字体
sht.range('D4').api.Font.Name = '宋体'
sht.range('D4').api.Font.Size = 30
sht.range('D4').api.Font.Italic = True # 将字体设置为倾斜
sht.range('D4').api.Font.Color = xw.utils.rgb_to_int((0, 128, 128))
# 保存文件并退出应用程序
wb.save()
wb.close()
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,打开示例数据文件,在工作表中设置指定单元格中文本的字体如图11-6所示。然后保存工作簿,关闭工作簿。
图11-6 设置指定单元格中文本的字体
【知识点扩展】
用xlwings包设置单元格中文本的字体,需要用api使用方式得到文本的Font对象,然后利用Font对象的属性和方法进行字体设置。
设置对齐方式
【问题描述】
用xlwings包打开Excel文件,并设置工作表中指定单元格中内容的对齐方式。内容对齐,有水平对齐和垂向对齐两个方向的设置。
【示例11-4】
本例使用的Excel文件的完整路径为“D:/Samples/ch11/xlwings/ 04 设置对齐方式/人员信息.xlsx”。该文件打开后如图11-7所示,是不同工作人员的工资数据。要求设置B3单元格中文本水平居中对齐;D5单元格中的文本水平左对齐;B8单元格中的文本水平右对齐,垂直方向顶对齐。
图11-7 人员工资数据
- 编写下面的xlwings代码:
import xlwings as xw
# 打开人员信息.xlsx文件
wb = xw.Book(r'D:/Samples/ch11/xlwings/04 设置对齐方式/人员信息.xlsx')
# 获取Sheet1工作表
sheet1 = wb.sheets['Sheet1']
# 设置B3单元格中文本的对齐方式为水平居中对齐
sheet1.range('B3').api.HorizontalAlignment = xw.constants.HAlign.xlHAlignCenter
# 设置D5单元格中文本的对齐方式为水平左对齐
sheet1.range('D5').api.HorizontalAlignment = xw.constants.HAlign.xlHAlignLeft
# 设置B8单元格文本的对齐方式为水平右对齐,垂直方向顶对齐
sheet1.range('B8').api.HorizontalAlignment = xw.constants.HAlign.xlHAlignRight
sheet1.range('B8').api.VerticalAlignment = xw.constants.VAlign.xlVAlignTop
# 保存文件并退出xlwings应用
wb.save()
wb.close()
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,打开示例数据文件,在工作表中设置指定单元格中文本的对齐方式如图11-8所示。然后保存工作簿,关闭工作簿。
图11-8 指定各单元格中文本的对齐方式
【知识点扩展】
用xlwings包设置单元格中文本的对齐方式,需要用api使用方式设置HorizontalAlignment属性和VerticalAlignment属性的值,例如
sheet1.range('B8').api.HorizontalAlignment = xw.constants.HAlign.xlHAlignRight
sheet1.range('B8').api.VerticalAlignment = xw.constants.VAlign.xlVAlignTop
单元格合并和取消合并
【问题描述】
用xlwings包打开Excel文件,并合并工作表中指定的单元格区域,或取消合并某合并单元格。
【示例11-5】
本例使用的Excel文件的完整路径为“D:/Samples/ch11/xlwings/05 单元格的合并和拆分/合并和拆分.xlsx”。该文件打开后如图11-9所示,B8是合并单元格。要求合并单元格区域B3:C4,将单元格B8取消合并。
图11-9 给定数据
- 编写下面的xlwings代码:
import xlwings as xw
# 打开文件
filepath = 'D:/Samples/ch11/xlwings/05 单元格的合并和拆分/合并和拆分.xlsx'
wb = xw.Book(filepath)
# 选择操作的工作表
sheet_name = 'Sheet1'
sheet = wb.sheets[sheet_name]
# 合并B3:C4单元格
cell_range = sheet.range('B3:C4')
cell_range.merge()
# 取消合并B8单元格
cell_range = sheet.range('B8')
cell_range.unmerge()
# 保存文件并退出
wb.save()
wb.close()
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,打开示例数据文件,在工作表中合并单元格区域B3:C4,将单元格B8取消合并如图11-10所示。然后保存工作簿,关闭工作簿。
图11-10 合并单元格和取消合并单元格
【知识点扩展】
使用xlwings包,调用单元格区域对象的merge方法和unmerge方法合并单元格区域和取消合并单元格区域。